/* nest自定义装饰器，其实和ts中效果一样，写法可能nest做了一层封装，有一套自己的逻辑 ，但本质都是一个函数，目的是为类，属性，方法，参数加功能*/

import { SetMetadata, createParamDecorator, ExecutionContext } from "@nestjs/common";

// 自定义方法装饰器
export const RequireLogin = () => SetMetadata("require-login", true);

// 使用函数剩余参数的思想：将权限收集到一个数组中
export const RequirePermission = (...permission: string[]) => SetMetadata("require-permission", permission);

// 自定义参数装饰器--第一参数会在装饰器触发时调用，data为传递过来的数据，ctx为执行上下文
// 返回值就是最终参数的值
export const UserInfo = createParamDecorator(
    (data: string, ctx: ExecutionContext) => {
        const request = ctx.switchToHttp().getRequest();
        if(!request.user) return null;

        return data ? request.user[data] : request.user;
    }
)
